package com.general.framework.zzyy.blockQueue;

import java.util.concurrent.ArrayBlockingQueue;

/**
 *
 * 阻塞队列应用场景：
 *      阻塞队列通常用于实现生产者-消费者模式，其中生产者线程将数据放入队列，消费者线程从队列中取出数据进行处理。
 *      阻塞队列还常用于实现线程池，其中任务队列用于存储待处理的任务，工作线程从队列中取出任务进行处理。
 *      阻塞队列还可以用于消息中间件，如RabbitMQ、Kafka等，其中消息队列用于存储待处理的消息。
 *
 * Java中提供了如ConcurrentLinkedQueue、CopyOnWriteArrayList等非阻塞队列实现
 *
 * Java中提供了诸如ArrayBlockingQueue、LinkedBlockingQueue等阻塞队列实现
 *
 * 在实际应用中，需要根据具体需求选择使用阻塞队列还是非阻塞队列。
 * 对于需要实现线程间同步的场景，如生产者消费者模型，阻塞队列是一个很好的选择。
 * 而对于不需要等待其他线程完成的情况，或者在高并发环境下需要提高性能的场景，非阻塞队列可能更为合适。
 */
public class BlockingDequeDemo {
    public static void main(String[] args) throws InterruptedException {
        ArrayBlockingQueue<String> objects = new ArrayBlockingQueue<>(3);
        System.out.println();
        objects.put("1");
        objects.put("2");
        objects.put("3");

        objects.add("4");

        // 抛出异常当阻塞队列满时,再往队列里面add插入元素会抛IllegalStateException: Queue full
        // System.out.println(objects.add("4"));
        System.out.println(objects.remove());
        System.out.println(objects.remove());
        System.out.println(objects.remove());
        // 抛出异常当阻塞队列为空时,再往队列里面remove移除元素会抛NoSuchElementException
        // System.out.println(objects.remove());
    }
}
